ftok과 IPC 키 생성

NOTE

ftok()으로 파일 기반 IPC 키를 생성하는 방법과 함정, 그리고 사람이 직접 hex로 키를 관리하는 명시적 테이블 방식과의 장단점 비교.

1. ftok()이란

ftok()은 System V IPC에 쓸 key(key_t)를 파일 하나로부터 생성하는 함수입니다.

#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
  • pathname: 실제 존재하는 파일 경로
  • proj_id: 1바이트짜리 구분값
  • 내부적으로 파일의 inode 번호 + 디바이스 번호 + proj_id를 비트 조합해서 키를 생성
key_t key = ftok("/tmp/myfile", 'A');
int qid = msgget(key, IPC_CREAT | 0666);

같은 파일 + 같은 proj_id로 여러 프로세스가 각자 계산해도 동일한 키가 나온다는 게 핵심입니다 — 별도 설정 공유 없이 “이 파일 기준”이라고 코드에만 박아두면 됩니다.

2. 함정

  1. 파일이 존재해야 함 (없으면 -1 반환)
  2. 완전한 유일성 보장은 안 됨 — 비트 조합이라 다른 파일 조합이 같은 키를 낼 수 있음(충돌 가능)
  3. 파일이 삭제 후 재생성되면 inode가 바뀌어 키도 바뀔 수 있음 (재현성 불안정)

3. 왜 명시적 테이블 방식을 쓰는 프레임워크도 있는가

일부 사내 프레임워크는 ftok() 대신 이름-키 매핑 테이블에 KEY를 사람이 직접 hex로 하드코딩하는 방식을 쓴다.

방식장점단점
ftok()설정 파일 없이 코드만으로 키 도출배포 환경마다 inode가 달라 불안정, 충돌 가능성
명시적 테이블어떤 프로세스가 어떤 키를 쓰는지 한눈에 보임, 환경이 바뀌어도 값 고정사람이 직접 안 겹치게 관리해야 함

수십 개 프로세스가 서로 키를 알아야 하는 대형 운영 시스템에서는 후자가 운영·디버깅에 유리해서 이 방식을 택하는 경우가 있다.

4. 겹치지만 않으면 됨

System V 키는 0(IPC_PRIVATE 예약값)만 피하면, 그 시스템에서 현재 떠 있는 다른 키와만 안 겹치면 됩니다. 이름-키 매핑 테이블에서 프로세스/팀별로 hex 대역을 나눠 쓰는 것은 기술적 강제사항이 아니라 협업 관례입니다.

핵심

ftok()은 파일에서 키를 유도하고, 명시적 테이블은 키를 사람이 못 박아둡니다. 둘 다 결국 “겹치지 않는 정수 하나”를 만드는 게 목적이라는 점은 같습니다.

관련 문서